# 一、定义一个学生Student类。有下面的类属性：
# 1 姓名 name

# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# 类方法：
#  1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# class Student:
#     def __init__(self, name, age, score):
#         self.name = name
#         self.age = age
#         self.score = score
#
#     def get_name(self):
#         return self.name
#
#     def get_age(self):
#         return self.age
#
#     def get_course(self):
#         return max(self.score.values())
#
# student1 = Student("甜筒", 20, {"语文": 90, "数学": 85, "英语": 95})
# print(f"学生1姓名：{student1.get_name()}，年龄：{student1.get_age()}，成绩最高的科目：{student1.get_course()}")
#
# student2 = Student("刘瀚文", 21, {"语文": 80, "数学": 90, "英语": 85})
# print(f"学生2姓名：{student2.get_name()}，年龄：{student2.get_age()}，成绩最高的科目：{student2.get_course()}")

# zm = Student('zhangming',20,[69,88,100])
# 二、定义一个字典类：dictclass。完成下面的功能：
# 1 删除某个key
# 2 判断某个键是否在字典里，如果在返回键对应的值，不存在则返回"not found"
# 3 返回键组成的列表：返回类型;(list)
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
# class dictclass:
#     def __init__(self, data=None):
#         self.data = data if data is not None else {}
#
#     def delete_key(self, key):
#         if key in self.data:
#             del self.data[key]
#
#     def contains_key(self, key):
#         return key in self.data
#
#     def keys_list(self):
#         return list(self.data.keys())
#
#     def merge_dict(self, other_dict):
#         self.data.update(other_dict)
#         return list(self.data.values())


# 四、定义一个列表的操作类：Listinfo
# 包括的方法:
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
# class Listinfo:
#     def __init__(self):
#         self.data = []
#
#     def add_key(self, keyname):
#         if isinstance(keyname, (str, int)):
#             self.data.append(keyname)
#         else:
#             print("Invalid keyname type. Please use string or integer.")
#
#     def get_key(self, num):
#         if num < len(self.data):
#             return self.data[num]
#         else:
#             print("Index out of range.")
#
#     def update_list(self, list):
#         self.data.extend(list)
#
#     def del_key(self):
#         if len(self.data) > 0:
#             return self.data.pop()
#         else:
#             print("List is empty.")
#  五、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
# class Student:
#     def __init__(self, name, age, address, phone):
#         self.name = name
#         self.age = age
#         self.address = address
#         self.phone = phone
#
#     def __str__(self):
#         return f"姓名: {self.name}, 年龄: {self.age}, 家庭地址: {self.address}, 手机号: {self.phone}"
#
#
# class RollCallSystem:
#     def __init__(self):
#         self.students = []
#
#     def add_student(self, name, age, address, phone):
#         student = Student(name, age, address, phone)
#         self.students.append(student)
#         print(f"{name} 存入成功！")
#
#     def update_student(self, name, age=None, address=None, phone=None):
#         for student in self.students:
#             if student.name == name:
#                 if age is not None:
#                     student.age = age
#                 if address is not None:
#                     student.address = address
#                 if phone is not None:
#                     student.phone = phone
#                 print(f"{name} 更新成功！")
#                 return True
#         print(f"未找到名为 {name} 的学生。")
#         return False
#
#     def delete_student(self, name):
#         for i, student in enumerate(self.students):
#             if student.name == name:
#                 del self.students[i]
#                 print(f"{name} 删除成功！")
#                 return True
#         print(f"未找到名为 {name} 的学生。")
#         return False
#
#     def show_all_students(self):
#         if len(self.students) == 0:
#             print("当前没有学生。")
#             return
#         print("全部学生信息：")
#         for student in self.students:
#             print(student)
#             print("-" * 50)  # 用于分隔学生信息，使输出更清晰。
#
#     def call_roll(self):
#         if len(self.students) == 1:
#             print(self.students)
#             return
#         student_name = input("请输入要点的学生姓名（输入 q 结束）：")
#         while student_name != "q":
#             for student in self.students:
#                 if student.name == student_name:
#                     print(f"{甜筒} 到！")
#                     break
#             else:  # 如果循环结束还没有找到对应的学生，则打印提示信息。
#                 print(f"未找到名为 {student_name} 的学生。")
#             student_name = input("请输入要点的学生姓名（输入 q 结束）：")
#             system.call_roll()
# 六、点餐管理系统
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人数）低于3分的菜品进行强制下架；
# class Dish:
#     def __init__(self, name, price, stock=999):
#         self.name = name
#         self.price = price
#         self.stock = stock
#         self.rating = 0
#         self.num_ratings = 0
#
#     def reduce_stock(self):
#         self.stock -= 1
#         if self.stock < 0:
#             print("库存不足，无法下单")
#             return False
#         return True
#
#     def update_rating(self, rating):
#         self.rating += rating
#         self.num_ratings += 1
#
#     def calculate_average_rating(self):
#         if self.num_ratings == 0:
#             return 0
#         return self.rating / self.num_ratings
#
#
# class Restaurant:
#     def __init__(self):
#         self.dishes = []
#
#     def add_dish(self, name, price):
#         dish = Dish(name, price)
#         self.dishes.append(dish)
#
#     def remove_dish(self, name):
#         for dish in self.dishes:
#             if dish.name == name:
#                 self.dishes.remove(dish)
#                 return True
#         print("未找到菜品")
#         return False
#
#     def update_dish(self, name, price=None, stock=None):
#         for dish in self.dishes:
#             if dish.name == name:
#                 if price is not None:
#                     dish.price = price
#                 if stock is not None:
#                     dish.stock = stock
#                 return True
#         print("未找到菜品")
#         return False
#
#     def display_dishes(self):
#         print("菜品列表：")
#         for dish in self.dishes:
#             print(f"{dish.name} - 价格：{dish.price} - 库存：{dish.stock}")
#             if dish.num_ratings > 0:
#                 print(f"评分：{dish.calculate_average_rating()} (共有 {dish.num_ratings} 人评价)")
#             else:
#                 print("暂无评分")
#             print("-" * 50)
#  七、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，
# 包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
# class Desk:
#     def __init__(self, length, width, height):
#         self.length = length
#         self.width = width
#         self.height = height
#
#     def showInfo(self):
#         print("桌子的长度是：", self.length)
#         print("桌子的宽度是：", self.width)
#         print("桌子的高度是：", self.height)
#
#
#
#
# desk1 = Desk(5, 10, 1)
# desk2 = Desk(15, 20, 2)
#
#
# desk1.showInfo()
# desk2.showInfo()
# 八、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
# class User:
#     def __init__(self, username, password):
#         self.username = username
#         self.password = password
# 九、定义一个计算器类，有加减乘除四个方法
# class Calculator:
#     def add(self, x, y):
#         return x + y
#
#     def subtract(self, x, y):
#         return x - y
#
#     def multiply(self, x, y):
#         return x * y
#
#     def divide(self, x, y):
#         if y == 0:
#             raise ValueError("除数不能为0")
#         return x / y
# 十、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"你好，我是{self.name}，我{self.age}岁了。")
        p = Person("甜筒", 21)
        p.greet()
        print(f"你好，我是{self.name}，我{self.age}岁了。")
# 十一、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
# import os
# import datetime
#
#
# class Book:
#     def __init__(self, book_name, author_name, publish_date):
#         self.book_name = book_name
#         self.author_name = author_name
#         self.publish_date = publish_date
#
#
# class BookSystem:
#     def __init__(self, file_path):
#         self.file_path = file_path
#         self.books = self.load_books()
#
#     def load_books(self):
#         if os.path.exists(self.file_path):
#             with open(self.file_path, 'rb') as file:
#                 return pickle.load(file)
#         else:
#             return []
#
#     def save_books(self):
#         with open(self.file_path, 'wb') as file:
#             pickle.dump(self.books, file)
#
#     def add_book(self, book):
#         if not isinstance(book, Book):
#             raise ValueError("图书对象必须是Book类的实例")
#         self.books.append(book)
#         self.save_books()
#
#     def update_book(self, book):
#         if not isinstance(book, Book):
#             raise ValueError("图书对象必须是Book类的实例")
#         for index, existing_book in enumerate(self.books):
#             if existing_book.book_name == book.book_name:
#                 self.books[index] = book
#                 self.save_books()
#                 return True
#         return False
#
#     def delete_book(self, book_name):
#         for book in self.books:
#             if book.book_name == book_name:
#                 self.books.remove(book)
#                 self.save_books()
#                 return True
#         return False
# 十二、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。
# 创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。
# 创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
# class Car:
#     def __init__(self, brand, color):
#         self.brand = brand
#         self.color = color
#
#     def start_engine(self):
#         print("启动汽车引擎！")
#
#     def stop_engine(self):
#         print("关闭汽车引擎！")
#         my_car = Car("Toyota", "Red")
#         my_car.start_engine()
#         my_car.stop_engine()
# 十三、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示
# class Product:
#     def __init__(self, name, sku, price):
#         self.name = name
#         self.sku = sku
#         self.price = price
#
#
# class TmallBackend:
#     def __init__(self):
#         self.products = []
#
#     def add_product(self, name, sku, price):
#         product = Product(name, sku, price)
#         self.products.append(product)
#         print(f"商品 {product.name} 已添加到列表中。")
#
#     def update_product(self, old_name, new_name, new_sku, new_price):
#         for product in self.products:
#             if product.name == old_name:
#                 product.name = new_name
#                 product.sku = new_sku
#                 product.price = new_price
#                 print(f"商品 {old_name} 的信息已更新为：{new_name} - {new_sku} - {new_price}")
#                 return True
#         return False
#
#     def remove_product(self, name):
#         for product in self.products:
#             if product.name == name:
#                 self.products.remove(product)
#                 print(f"商品 {name} 已从列表中移除。")
#                 return True
#         return False
# 十四、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤
# class Person:
#     def __init__(self, name, weight):
#         self.name = name
#         self.weight = weight
#         self.weight_after_run = weight - 0.5
#         self.weight_after_eat = weight + 1
#
#     def run(self):
#         print(f"{self.name}跑了步，体重变为{self.weight_after_run}公斤。")
#
#     def eat(self):
#         print(f"{self.name}吃了东西，体重变为{self.weight_after_eat}公斤。")
#         xiaoming = Person("小明", 75.0)
#         xiaomei = Person("小美", 45.0)
#         xiaoming.run()
#         xiaomei.run()
#         xiaoming.eat()
#         xiaomei.eat()
 # 十五、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 枪能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
class AK47:
    def __init__(self):
        self.bullet_count = 0

    def load_bullet(self):
        self.bullet_count += 1
        print(f"装填了子弹，现在有 {self.bullet_count} 颗子弹。")

    def fire(self):
        if self.bullet_count > 0:
            self.bullet_count -= 1
            print(f"开火，发射了一颗子弹，现在还有 {self.bullet_count} 颗子弹。")
        else:
            print("没有子弹了，发射失败。")
ak47 = AK47()
ak47.load_bullet()
ak47.fire()





